package com.jiazhong.dao;


import java.sql.*;

/**
 * 数据库操作封装类
 * 该类中包含以下3个方法:
 *  1.连接数据库方法
 *  2.释放资源
 *  3.执行增、删、改的方法
 */
public abstract class DBUtils {
    protected Connection conn = null;
    protected PreparedStatement ps = null;
    protected ResultSet rs = null;
    /**
     * 1.连接数据库方法
     * @return
     */
    protected Connection getConn() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/stu_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai", "root", "root");
        return conn;
    }

    /**
     * 释放资源
     */
    protected void closeAll(){
        try {
            if(rs != null){
                rs.close();
            }
            if(ps != null){
                ps.close();
            }
            if(conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            conn = null;
            ps = null;
            rs = null;
        }
    }

    /**
     * 执行增、删、改SQL语句的方法
     * @param sql       带有？号占位符的SQL语句
     * @param params    是SQL语句？号占位符的值
     *                  约束条件:SQL语句中?号占位符的顺序和值的顺序必须一致
     * @return          影响行数
     */
    protected int executeUpdate(String sql,Object... params){

        try {
            //连接数据库
            this.getConn();
            //创建预处理对象
            ps = conn.prepareStatement(sql);
            //设置SQL语句中？号占位符的值
            //判断SQL语句中是否存在?号占位符
            if(params!=null && params.length!=0){
                //循环设置SQL语句中?号占位符的值
                for(int i=0;i<params.length;i++){
                    ps.setObject(i+1,params[i]);
                }
            }
            //执行SQL语句并返回结果
            return ps.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally{
            //释放数据库资源
            this.closeAll();
        }
        return 0;//执行失败或未修改表中的数据

    }

}
